#include"blockqueue.hpp"
#include"Task.hpp"
#include<pthread.h>
#include<unistd.h>
#include<ctime>
#include<functional>


using namespace BlockQueueModule;
using namespace TaskModule;

using task_t = std::function<void()>;
void test()
{
	std::cout << "test" << std::endl;
}


void* Consumer(void* args)
{
	//BlockQueue<task_t> *bq = static_cast<BlockQueue<task_t>*>(args);  // 也可以用函数对象构建任务
	//task_t t;

	BlockQueue<Task> *bq = static_cast<BlockQueue<Task>*>(args);
	Task t;
	while(1)
	{
		//sleep(2);

		// 1. 从bq拿到数据
		bq->Pop(&t);

		// 2. 做处理
		t.Excute();
		printf("consumer,处理了一个任务:%d+%d=%d",t.X(),t.Y(),t.Result());
	}
}

void* Productor(void* args)
{
	BlockQueue<Task> *bq = static_cast<BlockQueue<Task>*>(args);

	int data = 10;
	while(1)
	{
		// 1.从外部获取数据
		int x = rand() % 10 + 1;
		int y = rand() % 20 + 1;
		Task t(x,y);  // 构建任务

		// 2.生产到bq中
		bq->Equeue(t);

		printf("productor,生产了一个任务:%d+%d = ?\n",t.X(),t.Y());

	}
}


int main()
{
	srand(time(nullptr) ^ getpid());

	BlockQueue<Task>* bq = new BlockQueue<Task>(5);

	// 单生产 单消费
	pthread_t c1,p1;
	//pthread_t c1,c2,p1,p2,p3;

	pthread_create(&c1,nullptr,Consumer,bq);
	//pthread_create(&c2,nullptr,Consumer,bq);
	pthread_create(&p1,nullptr,Productor,bq); 
	//pthread_create(&p2,nullptr,Productor,bq); 
	//pthread_create(&p3,nullptr,Productor,bq); 


	pthread_join(c1,nullptr);
	//pthread_join(c2,nullptr);
	pthread_join(p1,nullptr);
	//pthread_join(p2,nullptr);
	//pthread_join(p3,nullptr);
}

